public class OperaTipos
{
    /**
     * Determina el tipo resultante en una operacion lógica
     * @param t1 Tipo del primer operando
     * @param t2 Tipo del sgundo operando
     * @return Tipo del operando resultante
     */
    public static int opLog ( int t1, int t2 )
    {
        if ( t1 != Tipo.BOOLEAN )
            return Tipo.ERRORI;
        else if ( t2 != Tipo.BOOLEAN )
            return Tipo.ERRORD;
        else
            return Tipo.BOOLEAN;
    }


    /**
     * Comprueba que los tipos de una expresion relacional sean correctos
     * @param t1 Primer operando
     * @param t2 Segundo operando
     * @return Tipo del operando resultado
     */
    public static int opRel ( int t1, int t2 )
    {
        if ( t1 > 2 || t1 < 0 )
            return Tipo.ERRORI;
        else if ( t2 > 2 || t2 < 0)
            return Tipo.ERRORD;
        else
            return Tipo.BOOLEAN;

    }


    /**
     * Determina que tipo se obtiene al operar con dos tipos
     * @param t1 Tipo del primer dato
     * @param t2 Tipo del segundo dato
     * @return Tipo resultante al aplicar la operacion
     */
    public static int opAri ( int t1, int t2 )
    {
        if ( t1 == Tipo.BOOLEAN )
            return Tipo.ERRORI;
        else if (  t2 == Tipo.BOOLEAN )
            return Tipo.ERRORD;
        else if ( t1 == Tipo.DOUBLE )
            return Tipo.DOUBLE;
        else if ( t2 == Tipo.INT )
                return Tipo.INT;
        else
            return Tipo.DOUBLE;
    }

    public static int opAsig( int t1, int t2 )
    {
        if ( t1 == t2 )
            return t1;
        else if ( t1 == Tipo.INT && t2 == Tipo.DOUBLE )
            return Tipo.INT;
        else if ( t1 == Tipo.DOUBLE && t2 == Tipo.INT )
            return Tipo.DOUBLE;
        else
            return Tipo.ERROR;
    }
}
